"use strict";
// 大致思路:
// 只要字符池子够大 ,可以实现到N进制的转换
// 输入的10进制浮点数分割成整数部分和小数部分
// 小数点左边用整数不断  % 取余
// 小数点右边用小数不断乘以进制数凑"整"(进制的"整")
//  最后的结果中间加个点 两个结果拼接到一起
// 栈结构比较适合这个计算过程
class Stack {
  constructor() {
    // 栈中元素个数
    this.count = 0;
    // 数据
    this.items = {};
  }
  // 压栈
  push(element) {
    this.items[this.count] = element;
    this.count++;
  }
  // 出栈
  pop() {
    if (this.isEmpty()) {
      return undefined;
    }
    this.count--;
    const result = this.items[this.count];
    delete this.items[this.count];
    return result;
  }
  // 找朋友
  peek() {
    if (this.isEmpty()) {
      return undefined;
    }
    return this.items[this.count - 1];
  }
  // 空嘛?
  isEmpty() {
    return this.count === 0;
  }
  // 多大?
  size() {
    return this.count;
  }
  // 都消失吧
  clear() {
    this.items = {};
    this.count = 0;
  }
}
// 获取一个10进制浮点是的小数部分
function getDecimalPart(n) {
  return n - Math.trunc(n);
}
function numConverter(sourceNumber, base) {
  if (base > 64)
    throw '超纲了,超出字符池子大小';
  if (base < 2)
    throw '喵喵喵?意义何在?';
  // 字符池  先弄64个
  const chartPool = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ+/';
  const stackForLeft = new Stack();
  const stackForRight = new Stack();
  // 原数的整数部分
  let integer = Math.trunc(sourceNumber);
  // 原数的小数数部分
  let decimal = getDecimalPart(sourceNumber);
  // 余数
  let remainderForLeft;
  let remainderForRight;
  // 小数点左边
  let pointLeft = '';
  // 小数点右边
  let pointRight = '';
  // 算小数点左边
  while (integer > 0) {
    remainderForLeft = Math.floor(integer % base);
    stackForLeft.push(remainderForLeft);
    integer = Math.floor(integer / base);
  }
  while (!stackForLeft.isEmpty()) {
    // 栈中数据与字符池进行匹配 生成结果
    pointLeft += chartPool[stackForLeft.pop()];
  }
  console.log(stackForLeft.items);
  // 算小数点右边
  // 循环次数应该由精度决定, 这里凑合下写个10
  // 加班太多没时间写 后面再补吧
  for (let i = 0; i < 10; i++) {
    // remainderForRight =  Math.floor(decimal * base);
    // stackForRight.push(remainderForRight);
    // decimal =
  }
  if (!pointRight)
    return pointLeft;
  return `${pointLeft}.${pointRight}`;
}
